﻿using System;
using ResPackClient.DataBase;
using ResPackClient.DataBase.ResPackDataSetTableAdapters;
using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;

namespace ResPackClient
{
    /// <summary>
    /// Controle permettant la communication entre l'utilisateur et la base de données
    /// </summary>
    public partial class DataBaseExplorer : UserControl
    {
        /// <summary>
        /// Constructeur par défaut
        /// </summary>
        public DataBaseExplorer()
        {
            InitializeComponent();
            InitDataSet();
        }
        /// <summary>
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnExpendingDataBase(object sender, RoutedEventArgs e)
        {
            //Pre
            Debug.Assert(sender.GetType() == typeof(Expander));
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnAddRow(object sender, RoutedEventArgs e)
        {
            //Pre
            Debug.Assert(sender.GetType() == typeof(MenuItem));

            //Code
            e.Handled = true;
            MenuItem it = (MenuItem)sender;

            //WorkSpace
            if (it.Header == ResPackApp.Current.Resources["STR_MENU_DATA_WORKSPACE"])
            {
                AddWorkSpace add = new AddWorkSpace();
                add.Owner = ResPackApp.Current.MainWindow;

                if (add.ShowDialog() == true)
                {
                    InsertWorkSpace(add.WorkSpaceName);
                }

                return;
            }
            //Family
            else if (it.Header == ResPackApp.Current.Resources["STR_MENU_DATA_FAMILY"])
            {
                AddFamily add = new AddFamily();
                add.Owner = ResPackApp.Current.MainWindow;

                if (add.ShowDialog() == true)
                {
                    InsertFamily(add.FamilyName, add.FamilyDesc);
                }
            }
            //Type
            else if (it.Header == ResPackApp.Current.Resources["STR_MENU_DATA_TYPE"])
            {
                AddType add = new AddType(_dataset);
                add.Owner = ResPackApp.Current.MainWindow;

                if (add.ShowDialog() == true)
                {

                }
            }

        }
        /// <summary>
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnDeleteRow(object sender, RoutedEventArgs e)
        {
            //Pre
            Debug.Assert(sender.GetType() == typeof(MenuItem));

            //Code
            e.Handled = true;
            MenuItem it = (MenuItem)sender;

            //WorkSpace
            if (it.Header == ResPackApp.Current.Resources["STR_MENU_DATA_WORKSPACE"])
            {
                DeleteRow del = new DeleteRow(_dataset.tbWorkSpace);
                del.Owner = ResPackApp.Current.MainWindow;
               
                if (del.ShowDialog() == true)
                {
                    DeleteWorkSpace(del.PrimaryKey);
                }

                return;
            }
            //Family
            else if (it.Header == ResPackApp.Current.Resources["STR_MENU_DATA_FAMILY"])
            {
                DeleteRow del = new DeleteRow(_dataset.tbResourceFamilies);
                del.Owner = ResPackApp.Current.MainWindow;

                if (del.ShowDialog() == true)
                {
                    DeleteFamily(del.PrimaryKey);
                }
            }
            //Type
            else if (it.Header == ResPackApp.Current.Resources["STR_MENU_DATA_TYPE"])
            {
                DeleteRow del = new DeleteRow(_dataset.tbResourceTypes);
                del.Owner = ResPackApp.Current.MainWindow;

                if (del.ShowDialog() == true)
                {
                    DeleteType(del.PrimaryKey);
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnModifyWorkSpace(object sender, RoutedEventArgs e)
        {
            //Pre
            Debug.Assert(sender.GetType() == typeof(MenuItem));

            //Code
            e.Handled = true;

            ModifyWorkSpace add = new ModifyWorkSpace(_dataset);
            add.Owner = ResPackApp.Current.MainWindow;

            if (add.ShowDialog() == true)
            {
                ModifyWorkSpace(add.PrimaryKey,add.OldWorkSpaceName, add.WorkSpaceName);
            }

        }

        /// <summary>
        /// Charge les repertoires de travail de la base de données vers le dataset
        /// </summary>
        private void InitDataSet()
        {
            try
            {
                tbWorkSpaceTableAdapter ad = new tbWorkSpaceTableAdapter();
                ad.Fill(_dataset.tbWorkSpace);

                _tvDataBase.DataContext = _dataset;
            }
            catch (Exception)
            {
                Msg.Error("STR_ERR_FILL");
            }
        }
        /// <summary>
        /// Insert un repertoire dans la base de données
        /// </summary>
        /// <pre>
        /// Le dataset doit avoir été initialisé
        /// </pre>
        /// <pre>
        /// Le paramètre name doit contenir au minimum un charactere
        /// </pre>
        /// <seealso cref="InitDataSet()"/>
        /// <param name="name">Le nom du répertoire à inserer</param>
        private void InsertWorkSpace(string name)
        {
            //Pre
            Debug.Assert(_dataset != null);
            Debug.Assert(name != null);
            Debug.Assert(name.Length > 0);

            //Code
            try
            {
                tbWorkSpaceTableAdapter ad = new tbWorkSpaceTableAdapter();

                ad.Insert(name);
                ad.Fill(_dataset.tbWorkSpace);
            }
            catch (Exception)
            {
                Msg.Warning("STR_WARNING_INSERT");
            }
        }
        /// <summary>
        /// Modifie le nom du répertoire selectioné
        /// </summary>
        /// <param name="pk">La clef primaire identifiant le répertoire selectioné</param>
        /// <param name="newName">Le nouveau nom du repertoire</param>
        private void ModifyWorkSpace(int pk,string oldName,string newName)
        {
            //Pre
            Debug.Assert(_dataset != null);
            Debug.Assert(newName != null);
            Debug.Assert(newName.Length > 0);

            //Code
            try
            {
                tbWorkSpaceTableAdapter ad = new tbWorkSpaceTableAdapter();
                ad.Update(newName, pk);
                ad.Fill(_dataset.tbWorkSpace);             
            }
            catch (Exception)
            {
                Msg.Warning("STR_WARNING_MODIFY");
            }
        }
        /// <summary>
        /// Détruit le répertoire correspondant
        /// </summary>
        /// <pre>
        /// Le dataset doit avoir été initialisé
        /// </pre>
        /// <pre>
        /// Le paramètre pk doit correspondre à une clef primaire valide
        /// </pre>
        /// <param name="pk">La clef primaire</param>
        private void DeleteWorkSpace(int pk)
        {
            //Pre
            Debug.Assert(_dataset != null);

            try
            {
                tbWorkSpaceTableAdapter ad = new tbWorkSpaceTableAdapter();
                ad.Delete(pk);
                ad.Fill(_dataset.tbWorkSpace);
            }
            catch (Exception)
            {
                Msg.Warning("STR_WARNING_DELETE");
            }

        }
        /// <summary>
        /// Détruit la famille correspondante
        /// </summary>
        /// <pre>
        /// Le dataset doit avoir été initialisé
        /// </pre>
        /// <pre>
        /// Le paramètre pk doit correspondre à une clef primaire valide
        /// </pre>
        /// <param name="pk">La clef primaire</param>
        private void DeleteFamily(int pk)
        {
            //Pre
            Debug.Assert(_dataset != null);

            try
            {
                tbResourceFamiliesTableAdapter ad = new tbResourceFamiliesTableAdapter();
                ad.Delete(pk);
                ad.Fill(_dataset.tbResourceFamilies);
            }
            catch (Exception)
            {
                Msg.Warning("STR_WARNING_DELETE");
            }

        }
        /// <summary>
        /// Détruit le type correspondant
        /// </summary>
        /// <pre>
        /// Le dataset doit avoir été initialisé
        /// </pre>
        /// <pre>
        /// Le paramètre pk doit correspondre à une clef primaire valide
        /// </pre>
        /// <param name="pk">La clef primaire</param>
        private void DeleteType(int pk)
        {
            //Pre
            Debug.Assert(_dataset != null);

            try
            {
                tbResourceTypesTableAdapter ad = new tbResourceTypesTableAdapter();
                ad.Delete(pk);
                ad.Fill(_dataset.tbResourceTypes);
            }
            catch (Exception)
            {
                Msg.Warning("STR_WARNING_DELETE");
            }

        }
        /// <summary>
        /// Insert une famille dans la base de données
        /// </summary>
        /// <pre>
        /// Le dataset doit avoir été initialisé
        /// </pre>
        /// <pre>
        /// Le paramètre name doit contenir au minimum un charactere
        /// </pre>
        /// <seealso cref="InitDataSet()"/>
        /// <param name="name">Le nom de la famille à inserer</param>
        /// <param name="desc">La description de la famille</param>
        private void InsertFamily(string name,string desc)
        {
            //Pre
            Debug.Assert(_dataset != null);
            Debug.Assert(name != null);
            Debug.Assert(name.Length > 0);
            Debug.Assert(desc != null);

            //Code
            try
            {
                tbResourceFamiliesTableAdapter tb = new tbResourceFamiliesTableAdapter();
                tb.Insert(name, desc);
                tb.Fill(_dataset.tbResourceFamilies);
            }
            catch (Exception)
            {
                Msg.Warning("STR_WARNING_INSERT");
            }
        }
        /// <summary>
        /// DataSet représentant la base de donnée ResPack.sdk
        /// </summary>
        private ResPackDataSet _dataset = new ResPackDataSet();
    }

}
